#include "framelessRoundedwindow.h"
#include <QMouseEvent>
#include <QPainter>
#include <QPushButton>
#include <QVBoxLayout>
#include "screen.h"
FrameLessRoundedWindow::FrameLessRoundedWindow(QWidget *parent)
    : QWidget{parent}
    , leftPressed(false)
    , childWidgetMaxed(false)
    , padding(10)
{
    //设置去掉自带的边框和最大化和最小化按钮
    this->setWindowFlags(windowFlags() | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);
    //设置大小
    pos = QRect(0.27 * Screen::width,
                0.25 * Screen::height,
                0.46 * Screen::width,
                0.5 * Screen::height);
    this->setGeometry(pos);

    this->setMinimumSize(QSize(0.46 * Screen::width, 0.5 * Screen::height));

    minWidth = 0.46 * Screen::width;
    minHeigth = 0.5 * Screen::height;
    setAttribute(Qt::WA_TranslucentBackground); //这里是设置窗口透明

    this->installEventFilter(this);
}

void FrameLessRoundedWindow::mousePressEvent(QMouseEvent *event)
{
    //如果按下的不是鼠标左键，直接返回

    if (event->button() != Qt::LeftButton)
        return;

    leftPressed = true;
    //偏移量就等于鼠标的位置-左上角的位置（x,y）
    //出现错误的地方，position是相对于窗口来说的位置处，而globalPosition是相对于整个屏幕的位置处。
    //我们需要的是相对于屏幕的位置处
    offset = event->globalPosition().toPoint() - frameGeometry().topLeft();
    // qDebug() << "topLeft: " << frameGeometry().topLeft();
    // qDebug() << "Mouse position: " << event->globalPosition().toPoint();
    event->accept();
}

void FrameLessRoundedWindow::mouseMoveEvent(QMouseEvent *event)
{
    if (childWidgetMaxed) {
        //如果是最大化，那么直接退出，拖动和变化大小不起效
        return;
    }
    //这里就是获取的是全局坐标而不是相对于窗口的坐标
    QPoint globalPos = event->globalPosition().toPoint();

    if (!leftPressed) {
        //如果没有按下就需要判断是不是最大化的
        setCursorShape(globalPos);
    } else {
        //如果按下了，就需要判断是不是在中间
        //如果不在中间才移动
        if (hoverPos != CENTER) {
            QRect rect = this->rect();
            QPoint globalTopLeft = mapToGlobal(rect.topLeft());
            QPoint globalBottomRight = mapToGlobal(rect.bottomRight());

            QRect rMove(globalTopLeft, globalBottomRight);
            switch (hoverPos) {
            case TOP:
                // 如果不加if判断，则窗口高度达到最小高度后，会被鼠标 "向下推走"
                if (globalBottomRight.y() - globalPos.y() > minHeigth) {
                    //只有大于最小高度时才设置，才会变大
                    rMove.setY(globalPos.y());
                }
                break;
            case BOTTOM:
                //在底部的画只需要设置高度就行了
                rMove.setHeight(globalPos.y() - globalTopLeft.y());
                break;
            case LEFT:
                //在左边的话需要设置x的位置
                if (globalBottomRight.x() - globalPos.x() > minWidth) {
                    rMove.setX(globalPos.x());
                }
                break;
            case RIGHT:
                //在右边的话直接设置宽度就行了
                rMove.setWidth(globalPos.x() - globalTopLeft.x());
                break;
            case TOP_LEFT:
                //左上角的话，x和y都需要设置
                if (globalBottomRight.x() - globalPos.x() > minWidth)
                    rMove.setX(globalPos.x());
                if (globalBottomRight.y() - globalPos.y() > minHeigth)
                    rMove.setY(globalPos.y());
                break;
            case TOP_RIGHT:
                if (globalBottomRight.y() - globalPos.y() > minHeigth)
                    rMove.setY(globalPos.y());
                rMove.setWidth(globalPos.x() - globalTopLeft.x());
                break;
            case BOTTOM_LEFT:
                if (globalBottomRight.x() - globalPos.x() > minWidth)
                    rMove.setX(globalPos.x());
                rMove.setHeight(globalPos.y() - globalTopLeft.y());
                break;
            case BOTTOM_RIGHT:
                rMove.setWidth(globalPos.x() - globalTopLeft.x());
                rMove.setHeight(globalPos.y() - globalTopLeft.y());
                break;
            default:
                break;
            }
            this->setGeometry(rMove);
        } else {
            //等于中间
            //qDebug() << "move: " << hoverPos;
            move(QPoint(static_cast<int>(event->globalPosition().x() - offset.x()),
                        static_cast<int>(event->globalPosition().y() - offset.y())));
        }
    }
    event->accept();
}

void FrameLessRoundedWindow::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        leftPressed = false;
        event->accept();
    }
}

/**
 * @brief FrameLessRoundedWindow::paintEvent
 * @param event
 * 
 * 出现了问题，这里只是绘制了圆角，但是窗口还是矩形窗口而不是圆角的矩形，需要裁剪
 * 
 * 2/19 记录：错了，也是裁剪不了的，只会限制会话的区域，要设置圆角的，应该是要把窗口背景变为透明。
 * 然后再将指定的圆角区域绘制好。因此想要实现圆角窗口，在构造函数中一定要设置窗口透明，然后再绘画圆角矩形。
 */
void FrameLessRoundedWindow::paintEvent(QPaintEvent *event)
{
    //设置QPainter
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing); // 启用抗锯齿，圆角会更平滑

    // 设置画笔为灰色，宽度为1
    QPen pen;
    pen.setColor(Qt::gray);
    pen.setWidth(1);
    painter.setPen(pen);
    // 设置画刷为白色
    painter.setBrush(QColor(255, 255, 255)); //画刷是用来填充背景的

    QRect rect = this->rect();
    // qDebug() << "FrameLessRoundedWindow: " << rect;
    // 绘制圆角矩形
    painter.drawRoundedRect(rect, 10, 10); // 使用较大的圆角半径，确保圆角明显

    //然后就是要绘制线了
    QWidget::paintEvent(event);
}

/**
 * @brief FrameLessRoundedWindow::setCursorShape 这里就是根据鼠标的位置设置光标
 * @param point
 * Qt::SizeFDiagCursor是左上和右下的图标形状
 */
void FrameLessRoundedWindow::setCursorShape(const QPoint &point)
{
    QRect rect = this->rect();

    //获得相对应的位置，这里就需要将这个转换为全局的坐标，因为rect返回的是相对的坐标
    QPoint globalTopLeft = mapToGlobal(rect.topLeft());
    QPoint globalBottomRight = mapToGlobal(rect.bottomRight());

    //获得鼠标位置的x和y坐标
    int x = point.x();
    int y = point.y();

    //左上角的位置
    if (x >= globalTopLeft.x() && x <= globalTopLeft.x() + padding && y >= globalTopLeft.y()
        && y <= globalTopLeft.y() + padding) {
        hoverPos = TOP_LEFT;
        this->setCursor(QCursor(Qt::SizeFDiagCursor));
    } else if (x >= globalBottomRight.x() - padding && x <= globalBottomRight.x()
               && y >= globalBottomRight.y() - padding && y <= globalBottomRight.y()) {
        hoverPos = BOTTOM_RIGHT; //右下角
        this->setCursor(QCursor(Qt::SizeFDiagCursor));
    } else if (x >= globalBottomRight.x() - padding && x <= globalBottomRight.x()
               && y >= globalTopLeft.y() && y <= globalTopLeft.y() + padding) {
        //右上角
        hoverPos = TOP_RIGHT;
        this->setCursor(QCursor(Qt::SizeBDiagCursor));
    } else if (x >= globalTopLeft.x() && x <= globalTopLeft.x() + padding
               && y >= globalBottomRight.y() - padding && y <= globalBottomRight.y()) {
        //左下角
        hoverPos = BOTTOM_LEFT;
        this->setCursor(QCursor(Qt::SizeBDiagCursor));
    } else if (x >= globalTopLeft.x() && x <= globalTopLeft.x() + padding && y >= globalTopLeft.y()
               && y <= globalBottomRight.y() - padding) {
        //左边
        hoverPos = LEFT;
        this->setCursor(QCursor(Qt::SizeHorCursor));
    } else if (x >= globalBottomRight.x() - padding && x <= globalBottomRight.x()
               && y >= globalTopLeft.y() && y <= globalBottomRight.y() - padding) {
        //右边
        hoverPos = RIGHT;
        this->setCursor(QCursor(Qt::SizeHorCursor));
    } else if (x >= globalTopLeft.x() + padding && x <= globalBottomRight.x() - padding
               && y >= globalTopLeft.y() && y <= globalTopLeft.y() + padding) {
        //上边
        hoverPos = TOP;
        this->setCursor(QCursor(Qt::SizeVerCursor));
    } else if (x >= globalTopLeft.x() + padding && x <= globalBottomRight.x() - padding
               && y >= globalBottomRight.y() - padding && y <= globalBottomRight.y()) {
        //下边
        hoverPos = BOTTOM;
        this->setCursor(QCursor(Qt::SizeVerCursor));
    } else {
        //中间
        hoverPos = CENTER;
        this->setCursor(QCursor(Qt::ArrowCursor));
    }
}
